/**
 * 枚举类
 * Enum.IMAGE.name                => "图片"
 * Enum.getNameByKey('IMAGE')     => "图片"
 * Enum.getValueByKey('IMAGE')    => 10
 * Enum.getNameByValue(10)        => "图片"
 * Enum.getData()                 => [{key: "IMAGE", name: "图片", value: 10}]
 */
export type ElementType = {
  key: any;
  value: any;
};
class Enum {
  data: any[];
  keyArr: any[];
  valueArr: any[];
  constructor(param) {
    const keyArr: any = [];
    const valueArr: any = [];
    if (!Array.isArray(param)) {
      throw new Error('param is not an array!');
    }
    param.map((element) => {
      if (!element.key || !element.name) {
        return;
      }
      // 保存key值组成的数组，方便A.getName(name)类型的调用
      keyArr.push(element.key);
      valueArr.push(element.value);
      // 根据key生成不同属性值，以便A.B.name类型的调用
      this[element.key] = element;
      if (element.key !== element.value) {
        this[element.value] = element;
      }
    });

    // 保存源数组
    this.data = param;
    this.keyArr = keyArr;
    this.valueArr = valueArr;

    // 防止被修改
    Object.freeze(this);
  }

  // 根据key得到对象
  keyOf(key) {
    return this.data[this.keyArr.indexOf(key)];
  }

  // 根据key得到对象
  valueOf(key) {
    return this.data[this.valueArr.indexOf(key)];
  }

  // 根据key获取name值
  getNameByKey(key) {
    const prop = this.keyOf(key);
    if (!prop) {
      throw new Error('No enum constant' + key);
    }
    return prop.name;
  }

  // 根据value获取name值
  getNameByValue(value) {
    const prop = this.valueOf(value);
    if (!prop) {
      throw new Error('No enum constant' + value);
    }
    return prop.name;
  }

  // 根据key获取value值
  getValueByKey(key) {
    const prop = this.keyOf(key);
    if (!prop) {
      throw new Error('No enum constant' + key);
    }
    return prop.key;
  }

  // 返回源数组
  getData() {
    return this.data;
  }
}

export default Enum;
